package net.zoneland.greenleaf.common.worktimehelper;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * DateFormatUtil
 * 把经常用的一些DateFormat类型集中在一起管理，方便服务调用
 * @作者 liyi
 */
public class DateFormatUtil {
	/**
	 *  DateFormat 格式：yyyy-MM-dd hh:mm:ss
	 */
	public static DateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	/**
	 *  DateFormat 格式：yyyy-MM-dd
	 */
	public static DateFormat FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd");
	
	/**
	 *  DateFormat 格式：hh:mm:ss
	 */
	public static DateFormat FORMAT_TIME = new SimpleDateFormat("HH:mm:ss");
	/**
	 *  DateFormat 格式：MM-dd
	 */
	static SimpleDateFormat FORMAT_MONTHDAY = new SimpleDateFormat("MM-dd");
	
	/**
	 * 指定的日期，添加指定的天数
	 * @param date
	 */
	synchronized public static void addDay(Calendar date , int dayCount){
		date.set( Calendar.DAY_OF_YEAR , date.get(Calendar.DAY_OF_YEAR )+ dayCount) ;
	}
	
	/**
	 * 判断start 和end 两个日期是否为同一天
	 */
	synchronized public static boolean isTheSameDay(Calendar start , Calendar end){
		return (start.get(Calendar.YEAR) == end.get(Calendar.YEAR)) 
				&& (start.get(Calendar.MONTH) == end.get(Calendar.MONTH)) 
				&& (start.get(Calendar.DATE) == end.get(Calendar.DATE));
	}
	
	/**
	 * 判断给定的start 是否小于或者等于 end
	 */
	synchronized public static boolean lsOrEq(Calendar start , Calendar end){
		return end.getTimeInMillis() - start.getTimeInMillis() >= 0 ? true : false;
	}
	
	/**
	 * 判断给定的start 是否小于
	 */
	synchronized public static boolean ls(Calendar start , Calendar end){
		return end.getTimeInMillis() - start.getTimeInMillis() > 0 ? true : false;
	}
	
	/**
	 * 求两个日期相差的天数，精确到天
	 */
	synchronized public static int diffDay(Calendar start , Calendar end){
		long total = end.getTimeInMillis() - start.getTimeInMillis();
		return (int)(total/(1000 * 60 * 60 * 24));
	}
	
	/**
	 * 相差的好秒数
	 * @param start
	 * @param end
	 * @return
	 */
	synchronized public static long differMills(Calendar start , Calendar end){
		return start.getTimeInMillis() - end.getTimeInMillis();
	}
	
	/**
	 * 判断判断两个日期相差的天数是否有余数
	 */
	synchronized public static boolean isFullDiffDay(Calendar start , Calendar end){
		long total = end.getTimeInMillis() - start.getTimeInMillis();
		return (total)%(1000 * 60 * 60 * 24) == 0 ? true : false;
	}
	
	/**
	 * 将 src的年月日 复制到 tar 中。
	 */
	synchronized public static void cpyYMD(Calendar src , Calendar tar){
		tar.set(Calendar.YEAR, src.get( Calendar.YEAR ));
		tar.set(Calendar.MONTH, src.get( Calendar.MONTH ));
		tar.set(Calendar.DAY_OF_MONTH, src.get( Calendar.DAY_OF_MONTH ));
	}
	 
	/**
	 * 将 src的时分秒 复制到 tar 中。
	 */
	synchronized public static void cpyHMS(Calendar src , Calendar tar){
		tar.set(Calendar.HOUR_OF_DAY, src.get( Calendar.HOUR_OF_DAY ));
		tar.set(Calendar.MINUTE, src.get( Calendar.MINUTE ));
		tar.set(Calendar.SECOND, src.get( Calendar.SECOND ));
	}
	/**
	 * 将 src的时分秒 复制到 tar 中。
	 */
	synchronized public static Date cpyHMS(Date src , Date tar){
		Calendar src_c = Calendar.getInstance(); 
		Calendar tar_c = Calendar.getInstance();
		src_c.setTime(src);
		tar_c.setTime(tar);
		tar_c.set(Calendar.HOUR_OF_DAY, src_c.get( Calendar.HOUR_OF_DAY ));
		tar_c.set(Calendar.MINUTE, src_c.get( Calendar.MINUTE ));
		tar_c.set(Calendar.SECOND, src_c.get( Calendar.SECOND ));
		return tar;
	}
	
	/**
	 * 生成一个日期，按给定的time
	 * @param time 格式：HH:mm:ss
	 */
	synchronized public static Calendar gc(String time)throws ParseException{
		Calendar d = Calendar.getInstance();
		d.setTime(FORMAT_TIME.parse(time));
		return d;
	}
	
	/**
	 * 按照给定的src复制一个日期对象，并将给定的参数设置到新的日期对象中
	 * @param src 源日期对象
	 * @param h 时
	 * @param m 分
	 * @param s 秒
	 */
	synchronized public static Calendar gc(Calendar src , int h ,int m,int s ){
		Calendar d = (Calendar)src.clone();
		d.set(Calendar.HOUR_OF_DAY, h);
		d.set(Calendar.MINUTE, m); 
		d.set(Calendar.SECOND, s);
		return d;
	}
	
	/**
	 * 按照给定的日期字符串及格式生成一个Calendar类型的日期对象
	 * @param date 日期字符串 如：2010-07-10 18:00:00
	 * @param format 日期格式 如：yyyy-MM-dd HH:mm:ss
	 */
	synchronized public static Calendar gc(String date,String format)throws ParseException{
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Calendar d = Calendar.getInstance();
		d.setTime(sdf.parse(date));
		return d;
	}
	
	/**
	 * 按照给定的日期字符串及格式生成一个日期类型的对象
	 * @param date 日期字符串 如：2010-07-10 18:00:00
	 */
	synchronized public static Date formatDate(String dateString)throws ParseException{
		if(dateString!=null && dateString.length()>10){
			//说明格式是YYYY-MM-DD HH:mm:ss格式
			return FORMAT.parse(dateString);
		}else{
			if(dateString.indexOf("-")>=0){
				//说明格式是YYYY-MM-DD格式
				return FORMAT_DATE.parse(dateString);
			}else{
				//说明格式是HH:mm:ss格式
				return FORMAT_TIME.parse(dateString);
			}
		}
	}
}
